package fr.ul.ade.secunde.util;

import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import fr.ul.ade.R;
import fr.ul.ade.secunde.ui.ExtendedSpinnerAdapter;

/**
 * Méthodes auxiliaires pour les gestion des éléments graphiques.
 * 
 * @author Michaël Schnell
 * @since Jul 8, 2013
 * 
 * @version 1.4
 */
public abstract class UiUtils {

	/**
	 * Fixe le contenu du {@link TextView} identifié par {@code textViewId}
	 * contenu dans la vue fournie. Si le composant n'existe pas, la méthode ne
	 * fait rien.
	 * 
	 * @param parent
	 *            conteneur du {@link TextView}
	 * @param textViewId
	 *            identifiant du {@link TextView}
	 * @param content
	 *            nouveau contenu du {@link TextView}
	 */
	public static void setTextViewContent(View parent, int textViewId,
			CharSequence content) {
		final TextView textView = (TextView) parent.findViewById(textViewId);
		if (textView != null) {
			textView.setText(content);
		}
	}

	/**
	 * Retourne le contenu du {@link TextView} identifié par {@code textViewId}
	 * contenu dans la vue fournie.
	 * 
	 * @param parent
	 *            conteneur du {@link TextView}
	 * @param textViewId
	 *            identifiant du {@link TextView}
	 * @return contenu du {@link TextView} ou {@code null} si le composant
	 *         n'existe pas
	 */
	public static String getTextViewContent(View parent, int textViewId) {
		final TextView textView = (TextView) parent.findViewById(textViewId);
		if (textView != null) {
			return textView.getText().toString();
		}
		return null;
	}

	/**
	 * Recherche la position de l'élément fourni dans les valeurs du
	 * {@link Spinner} et sélectionne cette position. La comparaison se fait en
	 * utilisant la méthode {@code equals}.
	 * 
	 * @param parent
	 *            conteneur du {@link Spinner}
	 * @param spinnerId
	 *            identifiant du {@link Spinner}
	 * @param selected
	 *            item à sélectionner
	 */
	public static <T> void setSpinnerSelection(View parent, int spinnerId,
			T selected) {
		final Spinner spinner = (Spinner) parent.findViewById(spinnerId);
		final SpinnerAdapter adapter = spinner.getAdapter();
		if (adapter instanceof ExtendedSpinnerAdapter<?>) {
			spinner.setSelection(((ExtendedSpinnerAdapter<T>) adapter)
					.getItemPosition(selected));
		}
	}

	/**
	 * Retourne une vue contenant une {@link ListView} avec l'identifiant
	 * {@code @android:id/list} et une icône de chargement.
	 * 
	 * @param inflater
	 *            utilisé pour créer la vue
	 * @param container
	 *            parent optionnel de la vue
	 * @return {@link View} contenant une {@link ListView}
	 * 
	 * @see #addEmptyView(View, OnClickListener, int)
	 */
	public static View getListView(LayoutInflater inflater, ViewGroup container) {
		return inflater.inflate(R.layout.list_loading, container, false);
	}

	/**
	 * Ajoute une vue avec l'identifiant {@code @android:id/empty} qui joue le
	 * rôle d'empty view pour la {@code ListView} présente dans la vue
	 * {@code view} fournie. La méthode ne fait rien si la vue contient déjà un
	 * élément avec l'identifiant {@code @android:id/empty}.
	 * 
	 * @param inflater
	 *            utilisé pour créer la vue
	 * @param view
	 *            {@link View} contenant une {@link ListView}
	 * @param listener
	 *            écouteur du texte affiché ou {@code null} s'il ne faut pas
	 *            d'écouteur
	 * @param emptyTextId
	 *            identifiant du texte à afficher
	 * 
	 * @see #getListView(LayoutInflater, ViewGroup)
	 */
	public static void addEmptyView(final LayoutInflater inflater,
			final View view, OnClickListener listener, int emptyTextId) {
		final ViewGroup container = (ViewGroup) view;
		Log.d("[addEmptyView]", "Calling ...");
		if (view.findViewById(android.R.id.empty) == null) {
			Log.d("[addEmptyView]", "Adding empty view !");
			final View emptyView = inflater.inflate(R.layout.list_empty_view,
					container,
					false);

			final TextView createText = (TextView) emptyView
					.findViewById(R.id.empty_list_text);
			if (listener != null) {
				createText.setOnClickListener(listener);
			}
			createText.setText(emptyTextId);

			container.addView(emptyView);

			final ListView listView = (ListView) view
					.findViewById(android.R.id.list);
			listView.setEmptyView(emptyView);
		}
	}

	private UiUtils() {
	}

}// class UiUtils